/**
 * SessionUtils.java
 * Copyright © 2015-3015, 杭州泊享网络科技有限公司
 * 
 * @author Liu Tao
 * @create 2013-8-9
 */
package com.pshare.session.utils;

import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;

import com.pshare.constant.SeaxConstants;
import com.pshare.session.Session;
import com.pshare.session.SessionFactory;
import com.pshare.session.Trackable;
import com.pshare.util.CookieUtil;


/**
 * 会话工具类。
 * SessionUtils util = SessionUtils.getInstance();
 */
public class SessionUtil {
	
//	private static final String CACHE_USER_SESSIONID = "sessionId";
//	private static final String APPSESSION_ATTR_ACCOUNT_ID = "userid";
//	
//    private static SessionUtil sessionUtils;
//
//    private SessionFactory factory;
//
//    public SessionUtil(SessionFactory factory) {
//        super();
//        this.factory = factory;
//    }
//
//    public static SessionUtil getInstance(SessionFactory factory) {
//        if (sessionUtils == null)
//            sessionUtils = new SessionUtil(factory);
//        return sessionUtils;
//    }
//
//    /**
//     * 根据Cookie唯一会话编号判断是否已经登录。
//     * @param sid
//     * @return boolean
//     */
//    public boolean isLogin(final String sid) {
//        Session session = readSession(sid);
//        return session == null ? false : existAttribute(session, SeaxConstants.APPSESSION_ATTR_ACCOUNT);
//    }
//    
//    public boolean isLogin(final String sid, Session session) {
//    	return session == null ? false : existAttribute(session, SeaxConstants.APPSESSION_ATTR_ACCOUNT);
//    }
//    
//    /**
//     * 根据HttpServletRequest对象判断是否已经登录
//     * @param request
//     * @return
//     */
//    public boolean isLogin(HttpServletRequest request) {
//    	String sid = getToken(request);
//    	if(StringUtils.isBlank(sid)) {
//    		return false;
//    	}
//    	return isLogin(sid);
//    }
//    
//    public boolean isLogin(Session session, HttpServletRequest request) {
//    	String sid = getToken(request);
//    	if(StringUtils.isBlank(sid)) {
//    		return false;
//    	}
//    	return isLogin(sid, session);
//    }
//
//    /**
//     * <p>
//     * 保存登录对象信息。
//     * </p>
//     * 
//     * @param request
//     * @param object 对象信息
//     * @see SessionConstants.ATTRIBUTE_NAME
//     */
//    public void saveLogin(HttpServletRequest request, Object object) {
//        this.setAttribute(request, SeaxConstants.APPSESSION_ATTR_ACCOUNT, object);
//    }
//    
//    /**
//     * 销毁登录对象信息
//     *
//     * @param request
//     */
//    public void removeLogin(HttpServletRequest request) {
//        this.destroy(request);
//    }
//
//    /**
//     * 返回会话中是否存在某主键的值
//     * 
//     * @param session
//     * @param key
//     * @return
//     */
//    private boolean existAttribute(Session session, String key) {
//        Object obj = session.getAttribute(key);
//        return obj != null;
//    }
//
//    /**
//     * 设置当前请求会话指定键值对象到缓存中
//     *
//     * @param request
//     * @param key
//     * @param value
//     */
//    public void setAttribute(HttpServletRequest request, String key, Object value) {
//        String id = this.getToken(request);
//        Session session = getSession(id);
//        setAttribute(session, key, value);
//    }
//    
//    /**
//     * 设置当前请求会话指定键值对象到缓存中
//     *
//     * @param request
//     * @param Map<String, Object>
//     */
//    public void setAttributes(HttpServletRequest request, Map<String, Object> map) {
//        if (map == null || map.size() == 0) {
//        	return;
//        }
//        
//        String id = this.getToken(request);
//        Session session = getSession(id);
//        setAttributes(session, map);
//    }
//    
//    public void setAttribute(Session session, String key, Object value) {
//        session.setAttribute(key, value);
//        factory.put(session);
//    }
//    
//    /**
//     * 设置当前请求会话指定键值对象到缓存中
//     *
//     * @param request
//     * @param Map<String, Object>
//     */
//    public void setAttributes(Session session, Map<String, Object> map) {
//    	if (map == null || map.size() == 0) {
//    		return;
//    	}
//        for (String key : map.keySet()) {
//        	Object value = map.get(key);
//        	session.setAttribute(key, value);
//        }
//        factory.put(session);
//    }
//    
//    public void putSessionId(Session session) {
//    	if (session == null) {
//    		return;
//    	}
//    	Long userId = (Long) session.getAttribute(APPSESSION_ATTR_ACCOUNT_ID);
//    	if (userId == null) {
//    		return;
//    	}
//    	factory.putSessionId(CACHE_USER_SESSIONID + userId, session.getId());
//    }
//    
//    /**
//     * 销毁会话
//     *
//     * @param request
//     */
//    public void destroy(HttpServletRequest request) {
//        String id = getToken(request);
//    	if(StringUtils.isBlank(id)) 
//    		return;
//        destroy(id);
//    }
//    
//    public void destroy(String id) {
//    	if(StringUtils.isBlank(id)) 
//    		return;
//    	 Session session = readSession(id);
//         if(session == null)
//         	return;
//
//         Long userId = (Long) session.getAttribute(APPSESSION_ATTR_ACCOUNT_ID);
//         if (userId != null) {
//        	 factory.removeSessionId(CACHE_USER_SESSIONID + userId);
//         }
//         
//         session.destroy();
//    }
//    
//    /**
//     * 根据userId清空session
//     * @param userId
//     */
//    public void destroy(Long userId) {
//    	if(userId == null) 
//    		return;
//    	String sessionIdKey = CACHE_USER_SESSIONID + userId;
//    	String sessionId = factory.getSessionId(sessionIdKey);
//    	if(StringUtils.isBlank(sessionId)) 
//    		return;
//        
//    	// 先销毁session
//    	Session session = readSession(sessionId);
//    	session.destroy();
//    	// 再清空userId--sessionId记录
//    	factory.removeSessionId(sessionIdKey);
//    }
//
//    /**
//     * 返回当前请求的会话对象
//     *
//     * @param request
//     * @return
//     */
//    public Session getSession(HttpServletRequest request) {
//        String sessionId = getToken(request);
//        return getSession(sessionId);
//    }
//    
//    public Session readSession(HttpServletRequest request) {
//        String sessionId = getToken(request);
//        return readSession(sessionId);
//    }
//
//    /**
//     * 返回指定会话编号的会话对象
//     *
//     * @param id
//     * @return
//     */
//    public Session getSession(final String id) {
//        Session session = factory.getSession(new Trackable() {
//            public String getTrackId() {
//                return id;
//            }
//        });
//        return session;
//    }
//    
//    public Session createSession() {
//    	Session session = factory.newSession();
//    	return session;
//    }
//    
//    public Session readSession(final String id) {
//    	if (StringUtils.isBlank(id)) {
//    		return null;
//    	}
//        Session session = factory.readSession(new Trackable() {
//            public String getTrackId() {
//                return id;
//            }
//        });
//        return session;
//    }
//    
//    /**
//     * 根据userId读取sessionId
//     * @param userId
//     * @return String
//     */
//    public String readSessionId(final Long userId) {
//    	return userId == null ? null : factory.getSessionId(CACHE_USER_SESSIONID + userId);
//    }
//    
//    /**
//     * 根据userId读取Session
//     * @param userId
//     * @return Session
//     */
//    public Session readSession(final Long userId) {
//    	final String sessionId = readSessionId(userId);
//    	return readSession(sessionId);
//    }
//    
//    /**
//     * 从请求对象中获取会话编号
//     *
//     * @param request
//     * @return String
//     */
//    public String getToken(HttpServletRequest request) {
//    	// 先尝试从参数中读取
////    	String token = (String) request.getParameter(TOKEN_NAME);
////    	if(StringUtils.isBlank(token)) {
//    		// 再尝试从cookie读取
//    		String token = CookieUtil.getToken(request);
////    	}
//    	return token;
//    }
}
